const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const crypto = require('crypto');
const sql = require('./sql');

// 密钥，实际项目中应该放在环境变量中
const JWT_SECRET = 'AA56888';
const JWT_EXPIRES_IN = '24h'; // 令牌有效期

/**
 * 用户注册接口
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
const register = async (req, res) => {
  const { username, password, nickName } = req.body;

  try {
    // 1. 验证必填字段
    if (!username || !password) {
      return res.status(400).json({ 
        success: false,
        code: 400,
        message: '用户名和密码不能为空' 
      });
    }

    // 2. 验证用户名格式（3-20个字符，只允许字母、数字、下划线）
    const usernameRegex = /^[a-zA-Z0-9_]{3,20}$/;
    if (!usernameRegex.test(username)) {
      return res.status(400).json({ 
        success: false,
        code: 400,
        message: '用户名格式不正确，应为3-20个字符，只允许字母、数字、下划线' 
      });
    }

    // 3. 验证密码强度（至少6个字符）
    if (password.length < 6) {
      return res.status(400).json({ 
        success: false,
        code: 400,
        message: '密码长度至少为6个字符' 
      });
    }

    // 4. 检查用户名是否已存在
    const existingUsers = await sql.getUserByUsername(username);
    if (existingUsers && existingUsers.length > 0) {
      return res.status(409).json({ 
        success: false,
        code: 409,
        message: '用户名已存在' 
      });
    }

    // 5. 使用bcrypt加密密码（生产环境推荐）
    // const hashedPassword = await bcrypt.hash(password, 10);
    
    // 注意：当前登录接口使用明文密码比对，为保持一致性，这里也使用明文
    // 生产环境强烈建议使用bcrypt加密
    const hashedPassword = password;

    // 6. 生成唯一的用户ID（使用时间戳+随机数生成数字ID）
    // 数据库中user_id是BIGINT类型，不能使用UUID
    const userId = Date.now() + Math.floor(Math.random() * 1000);

    // 7. 准备用户数据
    const userData = {
      userId: userId,
      username: username,
      nickName: nickName || username, // 如果没有提供昵称，使用用户名作为昵称
      password: hashedPassword
    };

    // 8. 创建用户
    await sql.createUser(userData);

    // 9. 生成JWT令牌
    const token = jwt.sign(
      { 
        id: userId,
        username: username,
      },
      JWT_SECRET,
      { expiresIn: JWT_EXPIRES_IN }
    );

    // 10. 返回成功响应
    res.status(201).json({
      success: true,
      code: 201,
      message: '注册成功',
      token,
      data: {
        user: {
          userId: userId,
          username: username,
          nickName: userData.nickName
        }
      }
    });

  } catch (error) {
    console.error('注册错误:', error);
    
    // 处理数据库唯一约束错误
    if (error.code === 'ER_DUP_ENTRY') {
      return res.status(409).json({ 
        success: false,
        code: 409,
        message: '用户名已存在' 
      });
    }
    
    // 其他服务器错误
    res.status(500).json({ 
      success: false,
      code: 500,
      message: '服务器错误，请稍后再试' 
    });
  }
};

module.exports = { register };

